#include "SearchServer.h"
#include "unixHeader.h"

#include <workflow/MySQLMessage.h>
#include <workflow/MySQLResult.h>
#include <wfrest/json.hpp>

#include <iostream>

using namespace wfrest;
using std::string;
using std::cout;
using std::endl;
using std::vector;


SearchServer::SearchServer(int cnt, PageLibPrecessor* precessor) 
: _waitGroup(cnt)
, _precessor(precessor)
{}

void SearchServer::start(unsigned short port)
{
    if(_httpserver.track().start(port) == 0) {
        _httpserver.list_routes();
        _waitGroup.wait();
        _httpserver.stop();
    } else {
        printf("Cloudisk Server Start Failed!\n");
    }
}

void SearchServer::loadModules()
{
    loadStaticResourceModule();//加载静态资源，也就是加载前端界面
    loadSearchModule();//加载用户注册界面

}

void SearchServer::loadStaticResourceModule()
{
    //在浏览器GET的资源是html就会直接在浏览器界面显示
    //当客户端请求特定路径时，服务器返回相应的静态文件
    _httpserver.GET("/search", [](const HttpReq *, HttpResp * resp){
        resp->File("static/html/search.html");
    });
    //使用了Static方法来设置静态文件服务
    //说白了就是服务器一请求/file/upload_files就可以从static/view/upload_files下载文件
    // _httpserver.Static("/file/upload_files","static/view/upload_files");
}

void SearchServer::recommendWord(string searchContent, vector<string> &results)
{
    vector<string> cutedWord;//存放搜索的句子被分词后的词
    _precessor->_cuttor_cutCnString(searchContent, cutedWord, 1);//调用成员对象的方法，进行分词
    

}

void SearchServer::loadSearchModule()
{
    _httpserver.POST("/search", [this](const HttpReq *req, HttpResp *resp){
        // 检查 Content-Type 是否为 application/json
        if (req->content_type() == APPLICATION_JSON)
        {
            // 解析 JSON 数据
            auto json_body = req->json();  // 使用 req->json() 解析请求体

            // 检查 JSON 中是否包含 "query" 字段
            if (json_body.has("query"))  // wfrest JSON 提供了 `has()` 函数
            {
                // 获取搜索框输入的内容
                string search_query = json_body["query"].get<string>();
                
                // 输出到控制台
                //cout << "User searched for: " << search_query << "\n";

                vector<string> searchResults;//推荐词
                // 匹配推荐词
                recommendWord(search_query, searchResults);



                // 创建 JSON 响应
                wfrest::Json j;
                for (const auto& result : searchResults) {
                    j.push_back(result);
                }

                // 返回 JSON 数据
                resp->Json(j);
            }
            else
            {
                // 如果 JSON 中没有 "query" 字段，返回错误
                resp->set_status(HttpStatusBadRequest);
                resp->String("Invalid request: missing 'query' field");
            }
        }
        else
        {
            // Content-Type 不是 application/json，返回错误
            resp->set_status(HttpStatusBadRequest);
            resp->String("Invalid Content-Type. Expected application/json");
        }
    });
}


